// Copyright 2016 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
当然，以下是`CPDF_FontEncoding`类及其相关枚举和函数的功能概述：

### 枚举类型(Enum Types)

1. * *`enum class FontEncoding`* * :
-定义了多种字体编码方式，用于指定字符码到Unicode的映射规则。
- **`kBuiltin = 0`* * : 内置编码。
- **`kWinAnsi = 1`* * : Windows ANSI编码。
- **`kMacRoman = 2`* * : Macintosh Roman编码。
- **`kMacExpert = 3`* * : Macintosh Expert编码。
- **`kStandard = 4`* * : 标准编码。
- **`kAdobeSymbol = 5`* * : Adobe Symbol编码。
- **`kZapfDingbats = 6`* * : Zapf Dingbats编码。
- **`kPdfDoc = 7`* * : PDF文档编码。
- **`kMsSymbol = 8`* * : Microsoft Symbol编码。

### 全局函数(Global Functions)

1. * *`uint32_t CharCodeFromUnicodeForEncoding(fxge::FontEncoding encoding, wchar_t unicode);`* *
-根据指定的编码方式（`encoding`）将Unicode字符转换为字符码（charcode）。返回一个32位整数，表示字符码。

2. * *`wchar_t UnicodeFromAppleRomanCharCode(uint8_t charcode);`* *
-将Apple Roman编码的字符码（`charcode`）转换为Unicode字符。返回一个`wchar_t`类型的值，表示Unicode字符。

3. * *`pdfium::span<const uint16_t> UnicodesForPredefinedCharSet(FontEncoding encoding);`* *
-获取预定义字符集的Unicode列表。返回一个`pdfium::span<const uint16_t>`对象，表示Unicode列表。

4. * *`const char* CharNameFromPredefinedCharSet(FontEncoding encoding, uint8_t charcode);`* *
-根据预定义字符集和字符码（`charcode`）获取字符名称。返回一个C风格字符串，表示字符名称。

### 类 `CPDF_FontEncoding`

#### 公有成员函数(Public Member Functions)

1. * *`explicit CPDF_FontEncoding(FontEncoding predefined_encoding);`* *
-构造函数：使用预定义的编码方式初始化`CPDF_FontEncoding`实例。`predefined_encoding`是一个`FontEncoding`枚举值，表示编码方式。

2. * *`bool IsIdentical(const CPDF_FontEncoding * pAnother) const;`* *
-检查当前编码对象是否与另一个编码对象相同。返回布尔值，`true`表示相同，`false`表示不同。

3. * *`wchar_t UnicodeFromCharCode(uint8_t charcode) const;`* *
-根据字符码（`charcode`）获取对应的Unicode字符。返回一个`wchar_t`类型的值，表示Unicode字符。

4. * *`int CharCodeFromUnicode(wchar_t unicode) const;`* *
-根据Unicode字符获取对应的字符码（charcode）。返回一个整数，表示字符码。

5. * *`void SetUnicode(uint8_t charcode, wchar_t unicode);`* *
-设置指定字符码（`charcode`）对应的Unicode字符。`unicode`是一个`wchar_t`类型的值，表示要设置的Unicode字符。

6. * *`RetainPtr<CPDF_Object > Realize(WeakPtr<ByteStringPool> pPool) const;`* *
-将当前编码对象转换为PDF对象，并返回该对象的指针。`pPool`是一个弱引用指向`ByteStringPool`对象，用于管理字符串池。

#### 私有成员变量(Private Member Variables)

- **`std::array<wchar_t, kEncodingTableSize> m_Unicodes = {};`* *
-存储字符码到Unicode的映射表。`kEncodingTableSize`定义为256，表示每个字符码对应一个`wchar_t`类型的Unicode字符。

### 功能概述

`CPDF_FontEncoding`类用于管理和解析PDF文档中的字体编码。它提供了以下功能：

- **编码方式管理 * *：通过`FontEncoding`枚举定义了多种常见的字体编码方式，确保字符码到Unicode的正确映射。
- **字符码和Unicode的双向转换 * *：
- **`CharCodeFromUnicodeForEncoding`* * : 根据指定的编码方式将Unicode字符转换为字符码。
- **`UnicodeFromCharCode`* * : 根据字符码获取对应的Unicode字符。
- **`UnicodeFromAppleRomanCharCode`* * : 特别处理Apple Roman编码的字符码到Unicode的转换。
- **预定义字符集支持 * *：
- **`UnicodesForPredefinedCharSet`* * : 获取预定义字符集的Unicode列表，方便批量处理字符映射。
- **`CharNameFromPredefinedCharSet`* * : 根据预定义字符集和字符码获取字符名称，便于调试和日志记录。
- **自定义编码表 * *：通过`CPDF_FontEncoding`类可以创建和管理自定义的字符码到Unicode的映射表，支持动态修改字符映射关系。
- **PDF对象转换 * *：通过`Realize`方法将当前编码对象转换为PDF对象，方便将其保存到PDF文件中。

这些函数和成员变量共同工作，以实现对PDF文档中字体编码的高效管理和解析，确保字符的正确显示和渲染。`CPDF_FontEncoding`类是PDFium库中处理字体编码的核心组件之一，对于支持多种字符集和编码方式的PDF文档至关重要。
#ifndef CORE_FPDFAPI_FONT_CPDF_FONTENCODING_H_
#define CORE_FPDFAPI_FONT_CPDF_FONTENCODING_H_

#include <array>

#include "core/fxcrt/bytestring.h"
#include "core/fxcrt/retain_ptr.h"
#include "core/fxcrt/span.h"
#include "core/fxcrt/string_pool_template.h"
#include "core/fxcrt/weak_ptr.h"
#include "core/fxge/fx_fontencoding.h"

enum class FontEncoding {
  kBuiltin = 0,
  kWinAnsi = 1,
  kMacRoman = 2,
  kMacExpert = 3,
  kStandard = 4,
  kAdobeSymbol = 5,
  kZapfDingbats = 6,
  kPdfDoc = 7,
  kMsSymbol = 8,
};

uint32_t CharCodeFromUnicodeForEncoding(fxge::FontEncoding encoding,
                                        wchar_t unicode);

wchar_t UnicodeFromAppleRomanCharCode(uint8_t charcode);

pdfium::span<const uint16_t> UnicodesForPredefinedCharSet(
    FontEncoding encoding);
const char* CharNameFromPredefinedCharSet(FontEncoding encoding,
                                          uint8_t charcode);

class CPDF_Object;

class CPDF_FontEncoding {
 public:
  static constexpr size_t kEncodingTableSize = 256;

  explicit CPDF_FontEncoding(FontEncoding predefined_encoding);

  bool IsIdentical(const CPDF_FontEncoding* pAnother) const;

  wchar_t UnicodeFromCharCode(uint8_t charcode) const {
    return m_Unicodes[charcode];
  }
  int CharCodeFromUnicode(wchar_t unicode) const;

  void SetUnicode(uint8_t charcode, wchar_t unicode) {
    m_Unicodes[charcode] = unicode;
  }

  RetainPtr<CPDF_Object> Realize(WeakPtr<ByteStringPool> pPool) const;

 private:
  std::array<wchar_t, kEncodingTableSize> m_Unicodes = {};
};

#endif  // CORE_FPDFAPI_FONT_CPDF_FONTENCODING_H_
